#pragma once

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2c.h"
#include "ldg_utils.h"

#define GPIO_I2C_SDA GPIO_NUM_0
#define GPIO_I2C_SCL GPIO_NUM_1
#define I2C_MASTER_NUM I2C_NUM_0  /*!< I2C port number for master dev */
#define I2C_MASTER_FREQ_HZ 400000
#define I2C_MASTER_TIMEOUT_MS 1000

/**
 * 初始化I2C引脚
 */
esp_err_t ldg_i2c_master_init();

/**
 * 做为I2C主机读取数据
 * @param {uint8_t} slave_address 从机地址
 * @param {uint8_t} *read_cmd 读取的命令
 * @param {uint8_t} cmd_length 命令长度
 * @param {uint16_t} data_length 要读取的数据长度
 * @return {*} 读取结果
 */
ParseResult ldg_i2c_master_read(uint8_t slave_address, uint8_t *read_cmd, uint8_t cmd_length, uint16_t data_length);

/**
 * 做为I2C主机读取数据
 * @param {uint8_t} *read_cmd 读取的命令
 * @param {uint8_t} cmd_length 命令长度
 * @param {uint16_t} data_length 要读取的数据长度
 * @return {*} 读取结果
 */
ParseResult ldg_i2c_master_read_data(uint8_t *read_cmd, uint8_t cmd_length, uint16_t data_length);

/**
 * 做为I2C主机读取数据
 * @param {uint8_t} slave_address 从机地址
 * @param {uint16_t} data_length 要读取的数据长度
 * @return {*} 读取结果
 */
ParseResult ldg_i2c_master_read_data2(uint8_t slave_address, uint16_t data_length);

/**
 * 做为I2C主机写数据
 * @param {uint8_t} slave_address 从机地址
 * @param {uint8_t} *write_cmd 写入的命令
 * @param {uint8_t} cmd_length 命令长度
 * @param {uint16_t} data_length 要写入的数据长度
 * @return {*} 写入结果
 */
ParseResult ldg_i2c_master_write(uint8_t slave_address, uint8_t *write_cmd, uint8_t cmd_length, uint16_t data_length);